Understanding GraphQL schema stitching(part I)
目的是使用已经有的 graphql API,通过我们自己的服务器暴露出来. 在配置阶段,我们只是简单的转发收到的GraphQL query 和 mutations.负责转发这些操作的组件被称为 remote(executable)schema.
Remote shcema 作为 schema stitching schema的基础工具. 下面讨论一下细节问题.
回忆一下 GraphQL schemas
schema由两个主要组件构成(这里的组件不是 react组件)
- schema definition: 这部分通常用 schema definition language(SDL).本质上, schema 定义了 server能够接受的操作是什么, 需要报含- Querytype,可选的- Mutations,- Subscription. 可以用- typeDefs定义
- Resolvers: 这里是 shcema 真正进入到实际操作的地方, Resolvers实现了有由 schema 定义的 API 规范.
当一个 schema 有了 definition和 resolver,被称为executable schema.
下面是简单的实例,使用graphql-tools 的makeEcecutableSchema函数:
| 1 | const { makeExecutableSchema } = require('graphql-tools') | 
typeDefs包含了 schema 定义, 由Query和简单的User type组成. resolvers是包含了如何实现Query type 中user字段实现的方案
makeEcecutableSchema: 从 SDL type 映射到对应的 resolver.  返回的实例可以用于直接的查询. 例如graphql函数
| 1 | ... // other imports | 
因为 grphql 函数可以根据 GraphQLSchema的实例来查询,所以也可以被认为是 GraphQL(execute) 引擎
以上只是回顾. 现在看看如何根据已经存在的 graphql API 创建GraphQLSchema的可执行实例
Introspecting GraphQL APIS
GraphQL的有一个很趁手的属性, introspection. 可以发起一个 introspection query 来获取schema的定义.
| 1 | query { | 
返回的是 json 格式的数据
| 1 | { | 
返回的 schema和我们自己定义的 shcema 很像, 稍有差别,但是可以修改
创建一个 remote schema


makeRemoteExecutableSchema接收两个参数
- 一个 shcema 定义(这里通过 introspection 获取). 最佳实践是直接定义为 .grpahql文件
- Link连接被代理的 GraphQL API. 本质上, Link 是转发 query 和 mutation 的组件.
没有办法获取到 remote的 resolver.但是可以创建新的 resolver,来转发操作到内部的 GraphQL API.
看看实际的代码, 基于一个 API,用于User模型. 
| 1 | const fetch = require('node-fetch') | 
用于User type 的 CRUD API
| 1 | type User @model { | 
底层的 Remote schemas
Inspecting GraphQL schemas

篮框显示Query type和他的属性. 有字段allUsers,但是 没有 resolver,所以这不是可执行的. 

现在有 resolver了. 
继续看看 resolver的实现,(这是由 makeRemoteExecuteableSchema 自动生成的).
| 1 | function (root, args, context, info) { | 
12-16行代码 函数fetcher用三个参数调用,query,variables,context,